package com.snail.ron.design.singleton;

/**
 * @author xueguoping
 * @desc: TODO 延迟初始化占位类(静态内部类)
 * 静态内部类（延迟初始化占位类），比较常见的一种写法。JVM将推迟SingletonHolder的初始化操作，直到开始使用这个类时才初始化，
 * 并且由于通过一个静态初始化来初始化Singleton,因此不需要额外的同步。
 * 当任何一个线程第一次调用getInstance时，都会使SingletonHolder被加载和被初始化，此时静态初始化器执行SingletonFour的初始化操作。
 *
 * 通过静态初始化来初始化SingletonFour为什么不需要额外的同步？
 * 在初始化器中采用来特殊的方式来处理静态域（或者在静态初始化代码块中初始化的值），并提供来额外的线程安全性保证。
 * 静态初始化器是有JVM在类的初始化阶段执行，即在类被加载后并且被线程使用之前。
 * 由于JVM将在初始化期间获得一个锁，并且每个线程都至少获取一次这个锁以确保这个类已经加载，因此在静态初始化期间，内存写入操作将自动对所有线程可见。
 * 因此无论是在被构造期间还是被引用时，静态初始化的对象都不需要显示的同步。
 * 然而，这个规则仅适用与在构造时的状态，如果对象是可变的，那么在读线程和写线程之间仍然需要通过同步来确保随后的修改操作是可见的，以及避免数据破坏。
 *
 * 总结：线程安全、懒加载、效率高
 * 是否推荐：推荐使用、《Java Concurrency in Practice》作者Brian Goetz推荐适用的方式
 * @date 2022/4/1119:17
 */
public class SingletonFour {
    //私有构造
    private SingletonFour(){}

    //静态内部类
    private static class SingletonHolder{
        private static final SingletonFour singletonFour = new SingletonFour();
    }

    //public获取实例方法
    public static SingletonFour getInstance(){
        return SingletonHolder.singletonFour;
    }
}
